home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / LEZIONI / LEZIONE3.TXT < prev    next >
Text File  |  1994-11-05  |  23KB  |  498 lines

  1.  
  2.  CORSO DI ASSEMBLER - LEZIONE 3
  3.  
  4. Ora procederemo nella pratica, ma prima vi consiglio di caricarvi in un
  5. buffer di testo il file 68000.TXT che e' un riassunto della lezione2. Questo
  6. potra' esservi utile nel caso che non ricordaste un indirizzamento o una
  7. istruzione leggendo i listati di questa lezione, che presuppongono la
  8. familiarita' con gli indirizzamenti e le istruzioni affrontate prima.
  9. Il quel testo sono spiegati tutti gli indirizzamenti, anche quelli che non
  10. sono quasi mai usati, dunque leggetelo ma non preoccupatevi se non capite
  11. gli indirizzamenti con INDICE, tanto nella lezione3 non saranno usati!
  12.  
  13. In questa lezione si comincia a visualizzare qualcosa sullo schermo: per
  14. fare questo dobbiamo scrivere una COPPERLIST, cioe' un programma per il
  15. chip COPPER che si occupa della grafica, che abbiamo gia' usato per
  16. cambiare di colore lo schermo ($dff180 e' un registro del copper, che si
  17. chiama COLOR00).
  18. Per ora pero' abbiamo solo fatto delle modifiche col processore
  19. direttamente nei registri, e come avete potuto notare eseguendo i listati
  20. con AD un istruzione alla volta, quando mettiamo un valore nel COLOR00 (ossia
  21. $dff180) avviene solo un brevissimo lampo, e subito torna il colore normale del
  22. sistema operativo, ossia dell'ASMONE. Solo facendo un ciclo in cui si
  23. immette continuamente un numero si puo' colorare tutto lo schermo, ma una
  24. volta usciti dal programmino il colore ritorna inesorabilmente quello
  25. normale. Questo avviene perche' lo schermo che vediamo con finestre, scritte
  26. e tutto il resto e' il frutto di una COPPERLIST, e precisamente di una
  27. COPPERLIST di sistema. La copperlist non e' altro che una specie di:
  28.  
  29.     MOVE.W    #$123,$dff180    ; COLOR00 - immetti il colore 0
  30.     MOVE.W    #$123,$dff182    ; COLOR01 - immetti il colore 1
  31.     eccetera...
  32.  
  33. Che viene eseguito continuamente, quindi ecco spiegato perche' se col
  34. processore cambiamo il colore subito torna quello di sistema: perche'
  35. la copperlist ridefinisce ogni cinquantesimo di secondo tutti i colori!!!!
  36. Intuirete che per visualizzarsi delle figure in pace non e' possibile
  37. continuare a fare loop tentando di combattere con la copperlist di sistema
  38. che ridefinisce simultaneamente tutto, ma dovremo togliere di mezzo
  39. la copperlist di sistema e farcene una tutta nostra. NIENTE DI PIU' FACILE!
  40. Come ho gia'premesso, la copperlist non e' altro che una sfilza di MOVE
  41. che mettono dei valori nei registri del COPPER, ossia quelli $dffxxx;
  42. comunque non sono dei move fatti col processore, ma fatti dal copper
  43. stesso, che, non a caso, esegue questa COPPERLIST indipendentemente mentre
  44. col processore stiamo facendo altre cose... questo e' uno dei motivi per
  45. cui su PC non hanno LIONHEARTH o PROJECT X dell'Amiga.
  46. Dovremo quindi scrivergli proprio un LISTATO, come facciamo per il 68000,
  47. dopodiche' dovremo informare il COPPER dove si trova il nostro per farglielo
  48. leggere ed eseguire al posto di quello del WorkBench.
  49. Il copper ha SOLO 3 istruzioni, di cui in pratica ne vengono usate solo 2:
  50. le due usate sono il MOVE ed il WAIT; quella che non usa nessuno e' lo
  51. SKIP, quindi di quella ne parleremo solo se la troveremo in un listato
  52. di esempio.
  53. Il MOVE e' FACILISSIMO: avete presente un:
  54.  
  55.     MOVE.W    #$123,$dff180    ; Immetti il colore RGB nel COLOR00
  56.  
  57. Si traduce in copperlist in:
  58.  
  59.     dc.w    $180,$123    ; si mettono in memoria direttamente i
  60.                 ; numeri col dc.w, tanto basta
  61.                 ; impararci 2 istruzioni solamente!
  62.  
  63. Ossia: si deve mettere prima l'indirizzo di destinazione, senza il $dff
  64. come abbiamo gia' visto quando mettiamo $dff000 in a0, basta fare $180(a0):
  65. allo stesso modo i progettisti hanno pensato bene di risparmiarci la
  66. fatica di fare $DFF tutte le volte e cosi' basta mettere il $180, o il
  67. $182 o qualsiasi altro registro del COPPER, infatti SOLO i registri del
  68. Copper possono essere scritti dalla COPPERLIST, e si puo' accedere solo
  69. ai registri PARI, come $180,$182... mai $181,$183!!!!, inoltre potete
  70. modificare solo una WORD alla volta. Come avete visto, la COPPERLIST non
  71. viene assemblata come i comandi del 68000 che vengono trasformati da
  72. ISTRUZIONI come RTS, MOVE.. a $4e75, etc., bensì si devono mettere i BYTES come
  73. sono realmente in memoria e come sono letti dal coprocessore COPPER: per la
  74. COPPERLIST appunto dobbiamo usare il comando DC per metterla in memoria a
  75. forza di BYTES, ma e' facilissimo. Per esempio per definire i primi 4 colori:
  76.  
  77. COPPERLIST:
  78.     dc.w    $180,$000    ; COLORE 0 = NERO
  79.     dc.w    $182,$f00    ; COLORE 1 = ROSSO
  80.     dc.w    $184,$0F0    ; COLORE 3 = VERDE
  81.     dc.w    $186,$00F    ; COLORE 4 = BLU
  82.  
  83. Vi ricordate come e' il formato dei colori? RGB=RED, GREEN, BLU.
  84. Per avere un aiuto in ogni momento sul significato dei registri $dffXXX
  85. fate "=C 180" oppure "=C numero" e avrete un breve riassunto (in inglese).
  86. Per esempio fate "=c 006" e vedrete il nome e la spiegazione del registro
  87. che avete usato per far lampeggiare il colore. Per vedere tutti i registri
  88. fate semplicemente un "=C".
  89.  
  90. Il WAIT invece serve per aspettare una certa linea dello schermo, ad esempio
  91. se si vuol fare il colore di sfondo (color0) nero fino a meta', mentre
  92. nella meta' inferiore si vuole blu, basta mettere un
  93.  
  94.     dc.w    $180,0        ; colore 0 NERO
  95.  
  96. seguito da un WAIT che aspetta la meta' dello schermo, dopodiche'
  97.  
  98.     dc.w    $180,$00F    ; colore 0 BLU
  99.  
  100. Con questo stratagemma si puo' cambiare l'intera palette (i colori) a qualsiasi
  101. linea del video, cosa che invece su PC in VGA nemmeno si sognano, infatti
  102. anche se i giochi Amiga solitamente hanno schermi di soli 32 colori,
  103. cambiando la tavolozza dei colori ogni tanto man mano che lo schermo scende
  104. si possono fare piu' tonalita' di una VGA a 256 colori, specialmente se
  105. si considera che con un solo colore di sfondo si puo' fare una sfumatura
  106. cambiando il colore ad ogni linea, come faremo nel primo listato di
  107. questa lezione. Il comando WAIT si presenta in questa forma:
  108.  
  109.     dc.w    $1007,$FFFE    ; WAIT coordinata X= $10, Y= $07
  110.  
  111. Questo comando sognifica: ATTENDI LA LINEA ORIZZONTALE $10, colonna 7 (cioe'
  112. al settimo punto a partire da sinistra; i punti sono detti PIXEL).
  113. Il $FFFE significa WAIT, e va messo comunque tutte le volte, mentre il
  114. primo byte e' la linea orizzontale (x) da aspettare e il secondo e' quella
  115. verticale (y).
  116. Lo schermo infatti e' fatto di molti punti disposti l'uno accanto all'altro,
  117. come un foglio a quadretti molto piccoli, ad esempio la carta millimetrata.
  118. Per indicare il punto (pixel) situato (come nella battaglia navale) alla
  119. posizione 16,7, ossia a 16 punti dal bordo superiore del foglio verso il
  120. basso e 7 dal bordo sinistro verso destra, indichero $1007. ($10=16!).
  121. Di solito basta indicare la linea orizzontale al suo inizio, (la posizione
  122. e` $07 anziché $01 perché tanto quest'ultima è fuori del monitor all'estrema
  123. sinistra).
  124. L'istruzione WAIT e' usata anche per terminare la COPPERLIST: infatti
  125. per indicare la fine della COP va messo un
  126.  
  127.     dc.w    $FFFF,$FFFE    ; Fine Copperlist
  128.  
  129. Che per convenzione il Copper considera la fine, anche perche' indica di
  130. attendere una linea che non esiste! (la copperlist poi riparte da capo).
  131. Si e' sparsa la voce tempo fa che sarebbero necessarie due istruzioni di fine
  132. copperlist anziche' una sola per alcuni vecchi modelli di Amiga, ma sembra
  133. sia una psicosi di massa, dato che nessuno ne ha mai messe due e ha sempre
  134. funzionato tutto.
  135.  
  136. Un ultima cosa: per fare la nostra copperlist che per ora e' priva di
  137. disegni, ha solo sfumature, bisogna disabilitare i BITPLANE, ovvero
  138. i PIANI di BIT che sovrapponendosi danno luogo alle figure.
  139. per fare questo basta aggiungere la linea DC.W $100,$200, ossia mettiamo
  140. il valore $200 nel $dff100, che e' il registro di controllo dei bitplane.
  141.  
  142. ORA SIAMO IN GRADO DI FARE COMPLETAMENTE LA COPPERLIST CHE ASPETTA LA
  143. META' DEL VIDEO E CAMBIA IL COLORE!
  144.  
  145. COPPERLIST:
  146.     dc.w    $100,$200    ; BPLCON0 Nessuna figura, solo lo sfondo
  147.     dc.w    $180,0        ; Color 0 NERO
  148.     dc.w    $7f07,$FFFE    ; WAIT - Aspetta la linea $7f (127)
  149.     dc.w    $180,$00F    ; Color 0 BLU
  150.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  151.  
  152. COnsiderando che per verificare il funzionamento delle vostre copperlist
  153. dovrete fare delle sfumature di colore, ecco una TABELLA DI RIFERIMENTO PER
  154. LA SCELTA DEI COLORI COL COPPER:
  155.  
  156. L'Amiga ha 32 registri colore per 32 colori diversi:
  157.  
  158.     $dff180        ; color0 (sfondo)
  159.     $dff182        ; color1
  160.     $dff184        ; color2
  161.     $dff186        ; color3
  162.     ...
  163.     $dff1be        ; color31
  164.  
  165. In ognuno si questi 32 registri colore si puo' selezionare uno dei 4096 colori
  166. visualizzabili, "mischiando" i 3 colori fondamentali ROSSO,VERDE,BLU.
  167. Ognuno di questi 3 colori puo' avere una intensita' da 0 a 15, ossia 16 toni.
  168. Infatti il massimo numero di combinazioni e' 16*16*16=4096, ossia 16 ROSSI
  169. moltiplicato 16 VERDI moltiplicato 16 BLU.
  170. Il valore del colore si puo' mettere col processore o col COPPER:
  171.  
  172.     move.w    #$000,$dff180    ; colore NERO in color0
  173.  
  174.     dc.w    $180,$FFF    ; colore BIANCO in color0
  175.  
  176. In questo esempio abbiamo visto i due estremi: $FFF, ossia BIANCO, e $000,
  177. ossia NERO. Per scegliere il colore infatti occorre tener presente che la
  178. WORD del colore e' composta cosi':
  179.  
  180.     dc.w    $0RGB
  181.  
  182.     dove il quarto zero e' inutilizzato, mentre:
  183.  
  184.     R    =    componente ROSSA (RED)
  185.     G    =    componente VERDE (GREEN)
  186.     B    =    componente BLU   (BLU)
  187.  
  188. Infatti i bit dal 15 al 12 non sono utilizzati, i bit dall'11 all'8 sono il
  189. ROSSO, quelli dal 7 al 4 sono il VERDE, quelli dal 3 allo 0 sono il BLU.
  190.  
  191. Ogni colore RGB come gia' detto puo' avere un valore da 0 a 15, ossia da 0
  192. a $F in esadecimale, dunque e' facile scegliere il colore:
  193.  
  194.     $FFF    =    Bianco
  195.     $D00    =    Rosso mattone
  196.     $F00    =    Rosso
  197.     $F80    =    Rosso-Arancio
  198.     $F90    =    Arancione
  199.     $fb0    =    Giallo-oro
  200.     $fd0    =    Giallo-Cadmio
  201.     $FF0    =    Limone
  202.     $8e0    =    Verde chiaro
  203.     $0f0    =    Verde
  204.     $2c0    =    Verde scuro
  205.     $0b1    =    Verde albero
  206.     $0db    =    Acqua
  207.     $1fb    =    Acqua chiaro
  208.     $6fe    =    Blu cielo
  209.     $6ce    =    Blu chiaro
  210.     $00f    =    Blu
  211.     $61f    =    Blu brillante
  212.     $06d    =    Blu scuro
  213.     $c1f    =    Violetto
  214.     $fac    =    Rosa
  215.     $db9    =    Beige
  216.     $c80    =    Marrone
  217.     $a87    =    Marrone scuro
  218.     $999    =    Grigio medio
  219.     $000    =    nero
  220.  
  221.  
  222. Ora il problema e' solo come costringere il copper ad eseguire ordini dalla
  223. nostra COPPERLIST sviando la sua attenzione da quella del WorkBench; ma
  224. c'e' anche un altro problema: se facciamo eseguire la nostra, come facciamo
  225. dopo essere usciti a fargli rileggere quella di sistema???
  226. risposta: Bisogna segnarsi su un foglietto dove era!!!
  227. Ovvero: lo segnamo in un apposita longword denominata OLDCOP, ovvero
  228. VECCHIA COPPERLIST, quella di sistema.
  229. Ma a chi lo dobbiamo chiedere dove e' la copperlist di sistema? al sistema
  230. operativo ovviamente!! Per chiederglielo dovremo eseguire delle routines
  231. che sono nel CHIP del kickstart!!! Per fare questo bisogna sempre
  232. prendere come riferimento l'indirizzo che si trova nell'indirizzo $4, che
  233. viene scritto dal kickstart e contiene appunto l'indirizzo da cui si possono
  234. fare le distanze di indirizzamento prefissate, di cui parleremo in seguito.
  235. per raccogliere la long all'indirizzo $4 basta fare un:
  236.  
  237.     MOVE.L    $4,a6    ; In a6 ora abbiamo l'ExecBAse
  238.  
  239. O meglio
  240.  
  241.     MOVE.L    4.w,a6    ; Infatti 4 e' un numero piccolo e si puo' scrivere
  242.             ; 4.w, il che risparmia spazio. (scrive l'istruzione
  243.             ; con $0004 invece di scriverla con $00000004, in cui
  244.             ; i primi zeri non servono. VIENE COMUNQUE SPOSTATA
  245.             ; UNA LONGWORD! la long contenuta nei 4 bytes 4,5,6,7.
  246.  
  247. Messo l'indirizzo che era contenuto in $4 in a6, possiamo eseguire le
  248. routines del kickstart facendo dei JSR con la distanza di indirizzamento
  249. giusta, infatti esistono delle distanze di indirizzamento precise che
  250. corrispondono a certe routines gia' pronte nel kickstart.
  251. Ora sappiamo che se facciamo, ad esempio, un JSR -$78(a6) disabilitiamo
  252. il multitasking!!! Ovvero viene eseguito solo il nostro programma!
  253. facciamolo subito! Caricate LEZIONE3a.s in un buffer Fx ed eseguitelo.
  254.  
  255. Pero' la Exec non si occupa di tutto: il kickstart, lungo 256k se e' la
  256. versione 1.2 o 1.3, oppure lungo 512k se e' 2.0 o 3.0, e' diviso in
  257. library, ossia delle "raccolte" di routine gia' pronte che possono essere
  258. chiamate, e siccome ogni kickstart e' diverso proprio fisicamente, nel
  259. senso che ad esempio la routine della Exec che disabilita il sistema
  260. operativo nel kick 1.3 potrebbe essere a $fc1000, mentre nell'1.2 o nel 2.0
  261. a diversi indirizzi ancora, i cari progettisti hanno avuto una delle
  262. loro clamorose idee: "PERCHE' NON METTIAMO UN INDIRIZZO ALLA LOCAZIONE 4
  263. DA CUI SI POSSA SEMPRE ESEGUIRE LA STESSA ROUTINE FACENDO UN JSR ALLO STESSO
  264. OFFSET (OVVERO DISTANZA DI INDIRIZZAMENTO)? (P.S. JSR e' come BSR, solo che
  265. puo' eseguire routines in qualsiasi parte della memoria, mentre il bsr le
  266. puo' eseguire se sono entro 32768 bytes in avanti o indietro).
  267.  
  268. Ed e' questo quello che hanno fatto! Per eseguire ad esempio il Disable,
  269. che disabilita il sistema operativo, su tutti i kickstart basta fare:
  270.  
  271.     move.l    4.w,a6        ; Indirizzo della Exec in a6
  272.     jsr    -$78(a6)    ; Disable - blocca multitask
  273.     bsr.w    mioprogramma
  274.     jsr    -$7e(a6)    ; Enable - riabilita multitask
  275.  
  276. In ogni kickstart la routine sara' ad un indirizzo diverso, ma facendo in
  277. questo modo siamo sempre sicuri di eseguire quella routine.
  278. Basta sapere tutte le distanze di indirizzamento delle varie routines
  279. del sistema operativo per eseguirle, ma a noi interessa soltanto di
  280. salvare l'indirizzo della copperlist di sistema, e per farlo dobbiamo
  281. rivolgerci ad una parte delle routines del kick che si chiama:
  282. graphics.library, ossia quella che si occupa della GRAFICA, sia chiaro solo
  283. a livello di sistema operativo, non a livello hardware.
  284. Per accedere alla libreria grafica va APERTA, ossia dobbiamo fare cosi':
  285.  
  286.     move.l    4.w,a6        ; Execbase in a6
  287.     lea    GfxName,a1    ; Indirizzo del nome della lib da aprire in a1
  288.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  289.                 ; le librerie, e da in uscita l'indirizzo
  290.                 ; di base di quella libreria da cui fare le
  291.                 ; distanze di indirizzamento (Offset)
  292.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  293.     ....
  294.  
  295. GfxName:
  296.     dc.b    "graphics.library",0,0    ; NOTA: per mettere in memoria
  297.                     ; dei caratteri usare sempre il dc.b
  298. GfxBase:                ; e metterli tra "", oppure ''
  299.     dc.l    0
  300.  
  301. In questo caso abbiamo usato la routine della Exec OpenLibrary che richiede
  302. che sia messo in A1 l'indirizzo del testo con il nome della libreria da
  303. aprire. Per esempio potevamo aprire altre librerie come "dos.library" per
  304. caricare dei file o simili, "intuition.library" per aprire finestre ecc.
  305. Una volta eseguita al ritorno da in d0 l'indirizzo della libreria in
  306. questione, per intenderci un indirizzo come GfxBase da cui fare dei JSR
  307. con degli offset a proposito della grafica. Oltre ai JSR, sappiamo anche
  308. che, per esempio, l'indirizzo della COPPERLIST di sistema attuale e'
  309. situata a $26 bytes dopo il GfxBase, quindi continueremo il nostro
  310. programma salvando quell'indirizzo in una label OldCop:
  311.  
  312.     move.l    4.w,a6        ; Execbase in a6
  313.     lea    GfxName,a1    ; Indirizzo del nome della lib da aprire in a1
  314.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  315.                 ; le librerie, e da in uscita l'indirizzo
  316.                 ; di base di quella libreria da cui fare le
  317.                 ; distanze di indirizzamento (Offset)
  318.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  319.     move.l    d0,a6
  320.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  321.     ....            ; di sistema
  322.  
  323. GfxName:
  324.     dc.b    "graphics.library",0,0    ; NOTA: per mettere in memoria
  325.                     ; dei caratteri usare sempre il dc.b
  326. GfxBase:                ; e metterli tra "", oppure ''
  327.     dc.l    0
  328.  
  329. OldCop:
  330.     dc.l    0
  331.  
  332. Ora possiamo puntare la nostra copperlist, possiamo mettere un MouseWait
  333. e dopo ristabilire la vecchia cop; per puntare intendo mettere l'indirizzo
  334. della nostra copperlist nel registro COP1LC, ossia $dff080, che e' il
  335. puntatore alla copperlist nel senso che il copper esegue la copperlist il
  336. cui indirizzo si trova in $dff080: bastera' dunque mettere l'indirizzo in
  337. $dff080, poi per far partire la copperlist basta scrivere nel registro
  338. $dff088 (COPJMP1) qualsiasi cosa, basta che ci si scriva o che si legga che fa
  339. partire la copperlist, e' un registro detto STROBE, come fosse un bottone
  340. che basta toccarlo (NON USATE PERO' CLR.W $dff088, da dei problemi).
  341. Verra' cosi' eseguita ripetutamente ogni fotogramma la nostra copperlist fino
  342. a che non ne sara' messa un'altra nel $dff080 (COP1LC).
  343. Un problema e' che il $dff080 e' a sola scrittura, infatti se provare a fare
  344. un "=c 080" noterete il W di WRITE.
  345. Per poter rimettere a posto la copperlist di sistema, quella che visualizza
  346. l'asmone o il workbench, non potendone leggere l'indirizzo dal $dff080, dovremo
  347. chiedere al sistema operativo quale ci ha messo, e questo si puo' fare
  348. con delle routine del kickstart: una volta ottenuto l'indirizzo di quella
  349. copperlist lo salveremo in una LONGWORD del nostro programma, poi punteremo
  350. la nostra copperlist, e all'uscita del programma rimetteremo a posto quella
  351. vecchia.
  352.  
  353.     move.l    4.w,a6        ; Execbase in a6
  354.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  355.     lea    GfxName,a1    ; Indirizzo del nome della lib da aprire in a1
  356.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  357.                 ; le librerie, e da in uscita l'indirizzo
  358.                 ; di base di quella libreria da cui fare le
  359.                 ; distanze di indirizzamento (Offset)
  360.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  361.     move.l    d0,a6
  362.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  363.                 ; di sistema
  364.     move.l    #COPPERLIST,$dff080    ; COP1LC - Puntiamo la nostra COP
  365.     move.w    d0,$dff088        ; COPJMP1 - Facciamo partire la COP
  366. mouse:
  367.     btst    #6,$bfe001
  368.     bne.s    mouse
  369.  
  370.     move.l    OldCop(PC),$dff080    ; COP1LC - Puntiamo la cop di sistema
  371.     move.w    d0,$dff088        ; COPJMP1 - facciamo partire la cop
  372.  
  373.     move.l    4.w,a6
  374.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  375.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  376.                 ; (vanno aperte e chiuse le librerie!!!)
  377.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  378.     rts
  379.  
  380. GfxName:
  381.     dc.b    "graphics.library",0,0    ; NOTA: per mettere in memoria
  382.                     ; dei caratteri usare sempre il dc.b
  383. GfxBase:                ; e metterli tra "", oppure ''
  384.     dc.l    0
  385.  
  386. OldCop:
  387.     dc.l    0
  388.  
  389. COPPERLIST:
  390.     dc.w    $100,$200    ; BPLCON0 - Nessuna figura, solo lo sfondo
  391.     dc.w    $180,0        ; Color 0 NERO
  392.     dc.w    $7f07,$FFFE    ; WAIT - Aspetta la linea $7f (127)
  393.     dc.w    $180,$00F    ; Color 0 BLU
  394.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  395.  
  396. Troverete questo esempio con suggerimenti e modifiche in Lezione3b.s
  397. Caricatevelo nel buffer F2 o un altro qualsiasi ed ammirate il primo
  398. programma del corso che "BATTE NEL METALLO" dei CHIP dell'Amiga.
  399.  
  400. Avete fatto i vostri esperimenti sulla copperlist? Bene, ora vediamo di
  401. fare qualche effetto in movimento. Per cominciare pero' devo informarvi che
  402. per fare un qualsiasi movimento bisogna sincronizzare le routines con il
  403. pennello elettronico che ridisegna lo schermo. Per chi non lo sapesse infatti
  404. lo schermo viene ridisegnato 50 volte al secondo, e i movimenti che ci appaiono
  405. fluidi, ad esempio quelli dei videogames meglio programmati, sono spostamenti
  406. che coincidono con il cinquantesimo di secondo. Abbiamo gia' usato il registro
  407. $dff006, che come abbiamo visto cambia di valore continuamente, proprio
  408. perche' c'e' la posizione del pennello elettronico, il quale parte da zero,
  409. ossia dalla parte piu' alta dello schermo, e arriva in fondo 50 volte al
  410. secondo. Se facciamo una routine che fa dei movimenti sul video senza
  411. temporizzarla, andra' alla velocita' effettiva del processore, dunque troppo
  412. veloce per vedere qualcosa. Per attendere una certa linea video basta leggere
  413. il primo byte del $dff006, in cui troviamo la linea raggiunta, ossia la
  414. posizione verticale (uguale al WAIT del COPPER):
  415.  
  416. WaitLinea:
  417.     CMPI.B    #$f0,$dff006    ; VHPOSR - Siamo alla linea $f0? (240)
  418.     bne.s    WaitLinea    ; se no, ricontrolla
  419.     ...
  420.  
  421. questo ciclo aspetta la linea 240, dopodiche' l'esecuzione continua con
  422. le istruzioni seguenti, come la routine del Mouse che aspetta la pressione
  423. del tasto, dopodiche' continua l'esecuzione. Inseriamo anche il WaitMouse:
  424.  
  425. mouse:
  426.     cmpi.b    #$f0,$dff006    ; VHPOSR - Siamo alla linea 240?
  427.     bne.s    mouse        ; Se non ancora, non andare avanti
  428.  
  429.     bsr.s    RoutineTemporizzata    ; Questa routine viene eseguita 1
  430.                     ; volta sola per ogni fotogramma
  431.  
  432.     bsr.s    MuoviCopper    ; Il primo movimento sullo schermo!!!!!
  433.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  434.     bne.s    mouse        ; se no, torna a mouse:
  435.     rts
  436.  
  437. A questo punto abbiamo una routine che esegue una routine 1 sola volta per
  438. ogni FRAME video, ossia per ogni fotogramma, ossia 1 volta ogni cinquantesimo
  439. di secondo, e piu' esattamente viene eseguita non appena siamo arrivati alla
  440. linea 240, dopodiche', una volta eseguita, non sara' eseguita nuovamente
  441. fino a che' non saremo nuovamente alla linea 240, il fotogramma successivo.
  442.  
  443. NOTA: L'immagine viene disegnata con la tecnica RASTER tramite un pennello
  444. elettronico, che parte a disegnare dalla prima linea in alto a sinistra,
  445. prosegue verso destra fino alla fine della linea, poi riparte dall'estrema
  446. sinistra della linea 2, per andare verso destra ecc, analogamente al
  447. percorso che facciamo noi per leggere: ogni linea da sinistra verso destra,
  448. partendo dalla prima in altro fini all'ultima in basso, DOPODICHE' il
  449. pennello eletronico riparte dalla prima linea, primo punto a sinistra, come
  450. se noi avendo finito di leggere una pagina di libro ricominciassimo a leggerla
  451. anziche' leggere la pagina seguente. D'altronde il monotor e' uno solo e
  452. deve scrivere su quello solamente, il pennello non scrive sul muro.
  453.  
  454. Caricatevi l'esempio LEZIONE3c.s in un altro buffer di testo e provatelo.
  455. Questo esempio fa muovere in basso una WAIT e quindi il colore seguente
  456. quando premete il tasto destro del mouse. Tasto sinistro per uscire.
  457.  
  458. Avete compreso Lezione3c.s? Allora complichiamo leggermente le cose! Caricate
  459. la Lezione3c2.s in un buffer e studiatelo, ho aggiunto un controllo della linea
  460. raggiunta per fermare lo scroll.
  461.  
  462. Tutto chiaro in Lezione3c2.s?? Bene, continuiamo con la pratica caricando la
  463. Lezione3c3.s, in cui viene spostata una barretta sfumata fatta con 10 wait
  464. anziche' una sola linea WAIT. Sempre piu' difficile!!!
  465.  
  466. Siete sempre vivi dopo la Lezione3c3.s? Massacratevi il cervello con la lezione
  467. seguente, la Lezione3c4.s, in cui passiamo da 10 label BARRA ad una sola label
  468. eseguendo delle distanze di indirizzamento.
  469.  
  470. Beh, non era poi cosi' difficile. Il difficile viene ora con Lezione3d.s, in
  471. cui la barra va su e giu', e cambieremo anche la velocita' della barra.
  472.  
  473. Avete capito Lezione3d.s? Si? Non ci credo! Vi sembra di aver capito, non puo'
  474. essere.... io lo rivedrei un attimo prima di proseguire... lo avere rivisto?
  475. Beh... allora caricatevi una variazione sul tema, Lezione3d2.s
  476.  
  477. Ora siete pronti per affrontare la Lezione3e.s, in cui e' spiegato come fare
  478. una RASTERBAR ossia un effetto di scorrimento ciclico dei colori.
  479.  
  480. Un altro caso particolare: Come si fa a raggiungere la zona PAL (dopo $FF)
  481. con i wait del copper in Lezione3f.s.
  482.  
  483. Per completare la lezione3.txt, caricatevi la Lezione3g.s, e Lezione3h.s,
  484. concernenti uno scorrimento a destra e sinistra anziche' in basso ed in alto,
  485. dopodiche' sarete pronti per la LEZIONE4.TXT, in cui sara' trattata la gestione
  486. delle immagini colorate e dei possibili effetti su di esse! 
  487.  
  488.  
  489. NOTA:
  490. Gli Esempi4x.s della LEZIONE4.TXT si trovano nella directory SORGENTI2,
  491. dunque dovete fare un "V DF0:SORGENTI2" per rendere possibile il caricamento
  492. delle immagini da quella directory. Dopodiche' caricate la LEZIONE4.TXT in
  493. questo o in un altro buffer di testo. (con "r")
  494.  
  495. * Complimenti per essere arrivati qua! Il grosso e' fatto! Ora andando avanti
  496. capirete con facilita', essendo entrati nella logica della programmazione ASM!.
  497.  
  498.